
def text_name_encode(textenc): #string to bin
    enc =[]
    enc2=[]  
    textenc = textenc + " "
#    with open(textenc + ".txt", "r", encoding="utf-8") as isim:
    chars = []
#        for line in isim:
    for c in textenc:
        chars.append(c)
    
    enc1 = [bin(ord(i))[2:].zfill(8) for i in chars]
    enc2=enc1[:-1]
    strEnc2=''.join(enc2)
    enc3=strEnc2.split()
    strEnc3=' '.join([strEnc2[x:x+8] for x in range(0,len(strEnc2), 8)])

    return strEnc3

def XOR(one,two):
    try:
        len(one) == len(two)
    except Exception:
        print('异或长度异常')
    Rest = ''
    for i in len(one):
        if one[i] == two[i]:
            Rest = Rest + '0'
        else:
            Rest += '1'
    return Rest

def Zhi_Huan(rule,strs):
    Resmus = ""
    for i in rule:
#    print("源数字是:"+inits[i-1])
        Resmus = Resmus + strs[i-1]
    return Resmus
#=======================================================   


#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Enrms = '20:des32'
#Mark>>>>>>>>>>>>>>>>>>>>标记>>>输入数字(20:des??)<<<<<<<<<<<<<<<<<<<
#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

inites = text_name_encode(Enrms)
print('初始生成的数为>> '+inites)
noS_inites = inites.replace(' ','')
print('去除空格为>> '+noS_inites)

#           8       16          24      32      40      48      56          64
#inits = "0011001000110000001110100110010001100101011100110011001100110010"
#                  8       16          24      32      40      48      56         64
#inits_other = "00110010 00110000 00111010 01100100 01100101 01110011 00110011 00110010"

k1 = [57,49,41,33,25,17,9, #7
      1,58,50,42,34,26,18, #14
      10,2,59,51,43,35,27, #21
      19,11,3,60,52	,44,36,#28
      63,55,47,39,31,23,15,#35
      7,62,54,46,38,30,22, #42
      14,6,61,53,45	,37,29,#49
      21,13,5,28,20,12,4]  #56
k2 = [14,17,11,24,1,5,
      3,28,15,6,21,10,
      23,19,12,4,26,8,
      16,7,27,20,13,2,
      41,52,31,37,47,55,
      30,40,51,45,33,48,
      44,49,39,56,34,53,
      46,42,50,36,29,32,]
newinits = ""
for i in k1:
#    print("源数字是:"+inits[i-1])
    newinits = newinits + noS_inites[i-1]
print('======================第一次置换============================')
print("K1筛选后为: "+newinits)

print('======================分为左右============================')
C0 = newinits[:28]
#print('C01:'+C0[:7]+' '+C0[7,14]+' '+C0[14,21]+' '+C0[21,28])
D0 = newinits[28:]

print("C0: "+C0+"\n"+"D0: "+D0+"\n")

#左移 
C_all = []
D_all = []

for i in range(17):
    tmp = C0[i:]+C0[:i]
    print("第"+str(i)+"位C"+str(i)+": \t"+tmp)
    C_all.append(tmp)

for i in range(17):
    tmp = D0[i:]+D0[:i]
    print("第"+str(i)+"位D"+str(i)+": \t"+tmp)
    D_all.append(tmp)

new_Ks = []

for i in range(17):
    tmp = C_all[i]+D_all[i]
    print("新KEY(new_Ks"+str(i)+"): "+tmp)
    new_Ks.append(tmp)

Fn_dict_Keys = {}
ins = 0
for i in new_Ks:
    tmp = ""
    print("当前变换为["+str(ins)+"]: "+str(i))
    for s in k2:
        tmp = tmp + i[s-1]
    print("结果为:"+tmp)
    Fn_dict_Keys[ins] = tmp
    ins += 1

print('\n子密钥K1>>> '+Fn_dict_Keys[1]+'\n')
print('\t\t\t>>>>>>>>>>Part2<<<<<<<<<\n')



#=======================================================
#Enums = input('输入>>> ')

#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Enums = '80460132'
#Mark>>>>>>>>>>>>>>>>>>>>标记>>>输入数字(804601+??)<<<<<<<<<<<<<<<<<<<
#<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Dig_Enums = text_name_encode(Enums)
print('生成的二进制数为>>> '+Dig_Enums)
Dig_NoS_Enums = Dig_Enums.replace(' ','')
print('去除空格>>> '+Dig_NoS_Enums)


IP_First = [58,50,42,34,26,18,10,2,
60,52,44,36,28,20,12,4,
62,54,46,38,30,22,14,6,
64,56,48,40,32,24,16,8,
57,49,41,33,25,17,9,1,
59,51,43,35,27,19,11,3,
61,53,45,37,29,21,13,5,
63,55,47,39,31,23,15,7]

first_IP = ''

for i in IP_First:
    first_IP = first_IP + Dig_NoS_Enums[i-1]
print('==================第一次Ip置换=====================')
print("K1筛选后为: "+first_IP)
L0 = first_IP[:32]
R0 = first_IP[32:]
print('\n分为L0和R0:\nL0>>> '+L0+'\nR0>>> '+R0)

Ext_B = [32,1,2,3,4,5,
4,5,6,7,8,9,
8,9,10,11,12,13,
12,13,14,15,16,17,
16,17,18,19,20,21,
20,21,22,23,24,25,
24,25,26,27,28,29,
28,29,30,31,32,1]

Ext_R0 = ''

for i in Ext_B:
    Ext_R0 = Ext_R0 + R0[i-1]

Str_ExtR0 = str(Ext_R0)
lens = len(Str_ExtR0)
print('\nExtR0的长度为:'+str(lens)+'\nExtR0的结果为: '+Ext_R0)


#S盒
sbox = [
     # S1
     [14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
      0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
      4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
      15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13],
 
     # S2
     [15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
      3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
      0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
      13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9],
     # S3
     [10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
      13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
      13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
      1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12],
 
     # S4
     [7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
      13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
      10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
      3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14],
 
     # S5
     [2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
      14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
      4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
      11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3],
 
     # S6
     [12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
     10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
      9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
      4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13],
 
     # S7
     [4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
      13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
      1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
      6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12],
 
     # S8
     [13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
      1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
      7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
      2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11],
     ]

#P盒
p_Box = [
    15, 6, 19, 20, 28, 11,
    27, 16, 0, 14, 22, 25,
    4, 17, 30, 9, 1, 7,
    23,13, 31, 26, 2, 8,
    18, 12, 29, 5, 21, 10,
    3, 24]

#末尾
end_rules = [40,8,48,16,56,24,64,32,
39,7,47,15,55,23,63,31,
38,6,46,14,54,22,62,30,
37,5,45,13,53,21,61,29,
36,4,44,12,52,20,60,28,
35,3,43,11,51,19,59,27,
34,2,42,10,50,18,58,26,
33,1,41,9,49,17,57,25 ]